<!doctype html>
<html lang="zh-Hans" dir="ltr" class="docs-wrapper docs-doc-page docs-version-current plugin-docs plugin-id-default docs-doc-id-features/oauth2">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="generator" content="Docusaurus v2.0.1">
<link rel="search" type="application/opensearchdescription+xml" title="Knife4j" href="/opensearch.xml">

<!-- Google Tag Manager -->
    <script>!function(e,t,a,n,g){e[n]=e[n]||[],e[n].push({"gtm.start":(new Date).getTime(),event:"gtm.js"});var m=t.getElementsByTagName(a)[0],r=t.createElement(a);r.async=!0,r.src="https://www.googletagmanager.com/gtm.js?id=GTM-TKBX678",m.parentNode.insertBefore(r,m)}(window,document,"script","dataLayer")</script>
    <!-- End Google Tag Manager -->
<script src="/js/custom.js"></script>
<script src="/js/baidu.js"></script>
<script src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-1589206801610969" async crossorigin="anonymous"></script><title data-rh="true">3.19 OAuth2 | Knife4j</title><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://doc.xiaominfo.com/docs/features/oauth2"><meta data-rh="true" name="docusaurus_locale" content="zh-Hans"><meta data-rh="true" name="docsearch:language" content="zh-Hans"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="3.19 OAuth2 | Knife4j"><meta data-rh="true" name="description" content="Knife4j提供的OAuth2认证功能相对于原生SwaggerUi来说使用起来更加方便,因此也归为增强属性一类。至少从交互上而言。"><meta data-rh="true" property="og:description" content="Knife4j提供的OAuth2认证功能相对于原生SwaggerUi来说使用起来更加方便,因此也归为增强属性一类。至少从交互上而言。"><link data-rh="true" rel="icon" href="/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://doc.xiaominfo.com/docs/features/oauth2"><link data-rh="true" rel="alternate" href="https://doc.xiaominfo.com/docs/features/oauth2" hreflang="zh-Hans"><link data-rh="true" rel="alternate" href="https://doc.xiaominfo.com/docs/features/oauth2" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://3CRIMRK623-dsn.algolia.net" crossorigin="anonymous"><link rel="stylesheet" href="/assets/css/styles.66359a73.css">
<link rel="preload" href="/assets/js/runtime~main.e0db172c.js" as="script">
<link rel="preload" href="/assets/js/main.c059fb6e.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function e(e){document.documentElement.setAttribute("data-theme",e)}var t=function(){var e=null;try{e=localStorage.getItem("theme")}catch(e){}return e}();null!==t?e(t):window.matchMedia("(prefers-color-scheme: dark)").matches?e("dark"):window.matchMedia("(prefers-color-scheme: light)").matches?e("light"):e("dark")}()</script><div id="__docusaurus">
<div role="region"><a href="#" class="skipToContent_fXgn">跳到主要内容</a></div><nav class="navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Navigation bar toggle" class="navbar__toggle clean-btn" type="button" tabindex="0"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/knife4j-light.svg" alt="" class="themedImage_ToTc themedImage--light_HNdA"><img src="/img/knife4j-dark.svg" alt="" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">Knife4j</b></a><a class="navbar__item navbar__link" href="/docs/quick-start">文档</a><a class="navbar__item navbar__link changelog" href="/docs/middleware-sources">中间件</a><a class="navbar__item navbar__link changelog" href="/docs/oas">OAS规范</a><a class="navbar__item navbar__link changelog" href="/docs/action">实战指南</a><a class="navbar__item navbar__link changelog" href="/docs/changelog">更新日志</a><a class="navbar__item navbar__link changelog" href="/docs/faq">FAQ</a><div class="navbar__item dropdown dropdown--hoverable"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link">旧版本</a><ul class="dropdown__menu"><li><a class="dropdown__link" target="_blank" href="/v2/index.html">2.0.9</a></li></ul></div></div><div class="navbar__items navbar__items--right"><div class="toggle_MW0i colorModeToggle_x44X"><button class="clean-btn toggleButton_yw5v toggleButtonDisabled_BJd7" type="button" disabled="" title="切换浅色/暗黑模式（当前为暗黑模式）" aria-label="切换浅色/暗黑模式（当前为暗黑模式）"><span><svg viewBox="0 0 13 12" fill="none" xmlns="http://www.w3.org/2000/svg" width="14" height="14" class="lightToggleIcon_SFTY"><g clip-path="url(#clip0_833_8168)"><path d="M6.59998 8.49999C7.98069 8.49999 9.09998 7.3807 9.09998 5.99999C9.09998 4.61928 7.98069 3.49999 6.59998 3.49999C5.21926 3.49999 4.09998 4.61928 4.09998 5.99999C4.09998 7.3807 5.21926 8.49999 6.59998 8.49999Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M6.59985 0.5V1.5" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M6.59985 10.5V11.5" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M2.7099 2.11L3.4199 2.82" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M9.77991 9.17999L10.4899 9.88999" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M1.09998 6H2.09998" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M11.0999 6H12.0999" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M2.7099 9.88999L3.4199 9.17999" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M9.77991 2.82L10.4899 2.11" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path></g><defs><clipPath id="clip0_833_8168"><rect width="12" height="12" fill="white" transform="translate(0.599976)"></rect></clipPath></defs></svg><svg viewBox="0 0 13 12" width="14" height="14" class="darkToggleIcon_ekgs"><path d="M10.7001 6.39501C10.6215 7.24611 10.3021 8.05721 9.77927 8.7334C9.25646 9.40959 8.55189 9.92291 7.748 10.2133C6.9441 10.5036 6.07414 10.5591 5.2399 10.3731C4.40565 10.187 3.64164 9.76728 3.03726 9.1629C2.43287 8.55851 2.01312 7.7945 1.8271 6.96026C1.64108 6.12602 1.6965 5.25605 1.98688 4.45216C2.27725 3.64826 2.79056 2.94369 3.46675 2.42088C4.14294 1.89808 4.95404 1.57866 5.80515 1.50001C5.30685 2.17414 5.06707 3.00473 5.12941 3.84071C5.19175 4.6767 5.55208 5.46254 6.14485 6.05531C6.73762 6.64808 7.52346 7.0084 8.35944 7.07074C9.19542 7.13308 10.026 6.8933 10.7001 6.39501Z" stroke="currentColor" fill="transparent" stroke-linecap="round" stroke-linejoin="round"></path></svg></span></button></div><a href="https://github.com/xiaoymin/swagger-bootstrap-ui" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link icon" title="View on GitHub">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><div class="searchBox_ZlJk"><button type="button" class="DocSearch DocSearch-Button" aria-label="搜索"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">搜索</span></span><span class="DocSearch-Button-Keys"></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div class="main-wrapper mainWrapper_z2l0 docsWrapper_BCFX"><button aria-label="回到顶部" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docPage__5DB"><aside class="theme-doc-sidebar-container docSidebarContainer_b6E3"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/"><img src="/img/knife4j-light.svg" alt="" class="themedImage_ToTc themedImage--light_HNdA"><img src="/img/knife4j-dark.svg" alt="" class="themedImage_ToTc themedImage--dark_i4oU"><b>Knife4j</b></a><nav class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menuHtmlItem_M9Kj menu__list-item">
<div class="sidebar_donate">
    <div class="sidebar_sponsor">
        <a target="_blank" href="https://www.apifox.com/apiskills/apifox-auto-generates-api-docs/?utm_source=pay&utm_medium=knife4jg"><img src="/images/sponsor/apifox/Apifox IDEA@3x.png">
        </a>
    </div>
    <div class="sidebar_sponsor_submit">
        <a href="/docs/community/donate">成为赞助商</a>
    </div>
<div>
</div></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/quick-start">快速开始</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/community/joinus">如何贡献文档</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/community/contributing">如何贡献代码</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" href="/docs/introduction">序章</a><button aria-label="打开/收起侧边栏菜单「序章」" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" href="/docs/community">社区</a><button aria-label="打开/收起侧边栏菜单「社区」" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" aria-expanded="true" href="/docs/features">增强特性</a><button aria-label="打开/收起侧边栏菜单「增强特性」" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/enhance">3.1 增强模式</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/i18n">3.2 i18n国际化</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/author">3.3 接口添加作者</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/selfdocument">3.4 自定义文档</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/accessControl">3.5 访问权限控制</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/apiSort">3.6 接口排序</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/tagSort">3.7 分组排序</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/requestCache">3.8 请求参数缓存</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/dynamicRequestParameter">3.9 动态请求参数</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/exportDocument">3.10 导出离线文档</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/filterRequestParameter">3.11 过滤请求参数</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/includeRequestParameter">3.12 包含请求参数</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/search">3.13 搜索API接口</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/clearCache">3.14 清除缓存</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/dynamicRequestDescription">3.15 动态请求参数添加文档注释</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/dynamicResponseDescription">3.16 动态响应参数添加文档注释</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/host">3.17 自定义Host</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/afterScript">3.18 afterScript</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/docs/features/oauth2">3.19 OAuth2</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/postman">3.20 导出Postman</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/globalParameter">3.21 全局参数</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/swaggermodels">3.22 自定义Swagger Models名称</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/customHome">3.23 自定义主页内容</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/customFooter">3.24 自定义Footer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/jsr303">3.25 JSR303</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/forbidDebug">3.26 禁用调试</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/forbidSearch">3.27 禁用搜索框</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/forbidOpenApi">3.28 禁用OpenApi结构显示</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/features/gitVersion">3.29 版本控制</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" href="/docs/upgrading">版本升级</a><button aria-label="打开/收起侧边栏菜单「版本升级」" type="button" class="clean-btn menu__caret"></button></div></li></ul></nav><button type="button" title="收起侧边栏" aria-label="收起侧边栏" class="button button--secondary button--outline collapseSidebarButton_PEFL"><svg width="20" height="20" aria-hidden="true" class="collapseSidebarButtonIcon_kv0_"><g fill="#7a7a7a"><path d="M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"></path><path d="M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"></path></g></svg></button></div></aside><main class="docMainContainer_gTbr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_z5aJ"><div class="docItemContainer_c0TR"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="页面路径"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="主页面" class="breadcrumbs__link" href="/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_OVgt"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="/docs/features"><span itemprop="name">增强特性</span></a><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">3.19 OAuth2</span><meta itemprop="position" content="2"></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">本页总览</button></div><div class="theme-doc-markdown markdown"><h1>3.19 OAuth2</h1><p>Knife4j提供的OAuth2认证功能相对于原生SwaggerUi来说使用起来更加方便,因此也归为增强属性一类。至少从交互上而言。</p><blockquote><p>Knife4j自2.0.6版本开始添加对OAuth2的认证支持</p></blockquote><p>目前支持的OAuth2模式包括：简化模式(implicit)、授权码模式(authorization_code)、密码模式(password)、客户端模式(client_credentials)</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="3191-简化模式implicit">3.19.1 简化模式(implicit)<a class="hash-link" href="#3191-简化模式implicit" title="标题的直接链接">​</a></h2><p>简化模式(implicit)在Knife4j中界面显示效果如下(点击左侧菜单<strong>Authorize</strong>查看)：</p><p>简化模式(implicit)需要配置Knife4j提供的OAuth2的回调地址,回调页面位于<code>knife4j-spring-ui.jar</code>包</p><p>资源目录：<code>webjars/oauth/oauth2.html</code></p><p>因此,需要在服务端配置该回调地址,Spring Security OAuth2示例代码如下：</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">@Override</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">public void configure(ClientDetailsServiceConfigurer clients) throws Exception {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //简化模式（implicit）</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    clients.inMemory()</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        .withClient(&quot;app1&quot;).secret(&quot;123&quot;)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .authorizedGrantTypes(&quot;implicit&quot;)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .redirectUris(\&quot;http://192.168.1.10:8080/webjars/oauth/oauth2.html&quot;)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .scopes(&quot;read&quot;,&quot;write&quot;,&quot;reads&quot;,&quot;writes&quot;);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>界面效果如下：</p><p><img loading="lazy" src="/assets/images/oauth-implicit-0763a4c10cece4e07e89bb50c9663207.png" width="1034" height="364" class="img_ev3q"></p><p>使用者直接输入<code>clientId</code>，点击授权,此时进行调整授权界面,开发者授权即可</p><p><strong>注意</strong>：当点击按钮Authorize授权后,如果授权成功,接下来点击其余的接口进行调试时，在请求头会存在参数<code>Authorization</code>,如何在未授权之前打开了接口,则需要在授权后关闭该接口的Tab，然后重新打开</p><p>创建Swagger的授权配置示例代码：</p><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>点击查看代码</div><div class="admonitionContent_S0QG"><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">@Bean(value = &quot;defaultApi2&quot;)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">public Docket defaultApi2() {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //schema</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    List&lt;GrantType&gt; grantTypes=new ArrayList&lt;&gt;();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //简单模式implicit</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    ImplicitGrant implicitGrant=new ImplicitGrant(new LoginEndpoint(&quot;http://localhost:8999/oauth/authorize&quot;),&quot;access_token&quot;);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    grantTypes.add(implicitGrant);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    OAuth oAuth=new OAuthBuilder().name(&quot;oauth2&quot;)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .grantTypes(grantTypes).build();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //context</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //scope方位</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    List&lt;AuthorizationScope&gt; scopes=new ArrayList&lt;&gt;();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    scopes.add(new AuthorizationScope(&quot;read&quot;,&quot;read all resources&quot;));</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    SecurityReference securityReference=new SecurityReference(&quot;oauth2&quot;,scopes.toArray(new AuthorizationScope[]{}));</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    SecurityContext securityContext=new SecurityContext(CollectionUtil.newArrayList(securityReference),PathSelectors.ant(&quot;/api/**&quot;));</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //schemas</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    List&lt;SecurityScheme&gt; securitySchemes=CollectionUtil.newArrayList(oAuth);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //securyContext</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    List&lt;SecurityContext&gt; securityContexts=CollectionUtil.newArrayList(securityContext);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    String groupName=&quot;2.X版本&quot;;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    Docket docket=new Docket(DocumentationType.SWAGGER_2)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .host(&quot;https://www.baidu.com&quot;)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .apiInfo(apiInfo())</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .groupName(groupName)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .select()</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .apis(RequestHandlerSelectors.basePackage(&quot;com.swagger.bootstrap.ui.demo.new2&quot;))</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .paths(PathSelectors.any())</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .build()</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .securityContexts(securityContexts).securitySchemes(securitySchemes);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    return docket;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="3192-授权码模式authorization_code">3.19.2 授权码模式(authorization_code)<a class="hash-link" href="#3192-授权码模式authorization_code" title="标题的直接链接">​</a></h2><p>授权码模式(authorization_code)在Knife4j中界面显示效果如下(点击左侧菜单<strong>Authorize</strong>查看)：</p><p>授权码模式(authorization_code)需要配置Knife4j提供的OAuth2的回调地址,回调页面位于<code>knife4j-spring-ui.jar</code>包</p><p>资源目录：<code>webjars/oauth/oauth2.html</code></p><p>因此,需要在服务端配置该回调地址,Spring Security OAuth2示例代码如下：</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">@Override</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">public void configure(ClientDetailsServiceConfigurer clients) throws Exception {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //授权码模式（authorization code）</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    clients.inMemory()</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        .withClient(&quot;app1&quot;).secret(&quot;123&quot;)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .authorizedGrantTypes(&quot;authorization_code&quot;)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .redirectUris(\&quot;http://192.168.1.10:8080/webjars/oauth/oauth2.html&quot;)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .scopes(&quot;read&quot;,&quot;write&quot;,&quot;reads&quot;,&quot;writes&quot;);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>界面效果如下：</p><p><img loading="lazy" src="/assets/images/oauth-authorization-ae45c250dbade34f3ffe873c942c713f.png" width="1035" height="422" class="img_ev3q"></p><p>使用者直接输入<code>clientId</code>及<code>clientSecret</code>后，点击授权,此时进行调整授权界面,开发者授权即可</p><p><strong>注意</strong>：当点击按钮Authorize授权后,如果授权成功,接下来点击其余的接口进行调试时，在请求头会存在参数<code>Authorization</code>,如何在未授权之前打开了接口,则需要在授权后关闭该接口的Tab，然后重新打开</p><p>创建Swagger的授权配置示例代码：</p><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>点击查看代码</div><div class="admonitionContent_S0QG"><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">@Bean(value = &quot;defaultApi2&quot;)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">public Docket defaultApi2() {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //schema</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    List&lt;GrantType&gt; grantTypes=new ArrayList&lt;&gt;();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //授权码模式AuthorizationCodeGrant</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    TokenRequestEndpoint tokenRequestEndpoint=new TokenRequestEndpoint(&quot;http://localhost:8999/oauth/authorize&quot;,&quot;app1&quot;,&quot;123&quot;);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    TokenEndpoint tokenEndpoint=new TokenEndpoint(&quot;http://192.168.1.10:8080/oauth/token&quot;,&quot;access_token&quot;);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    AuthorizationCodeGrant authorizationCodeGrant=new AuthorizationCodeGrant(tokenRequestEndpoint,tokenEndpoint);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    grantTypes.add(authorizationCodeGrant);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    OAuth oAuth=new OAuthBuilder().name(&quot;oauth2&quot;)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .grantTypes(grantTypes).build();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //context</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //scope方位</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    List&lt;AuthorizationScope&gt; scopes=new ArrayList&lt;&gt;();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    scopes.add(new AuthorizationScope(&quot;read&quot;,&quot;read all resources&quot;));</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    SecurityReference securityReference=new SecurityReference(&quot;oauth2&quot;,scopes.toArray(new AuthorizationScope[]{}));</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    SecurityContext securityContext=new SecurityContext(CollectionUtil.newArrayList(securityReference),PathSelectors.ant(&quot;/api/**&quot;));</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //schemas</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    List&lt;SecurityScheme&gt; securitySchemes=CollectionUtil.newArrayList(oAuth);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //securyContext</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    List&lt;SecurityContext&gt; securityContexts=CollectionUtil.newArrayList(securityContext);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    String groupName=&quot;2.X版本&quot;;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    Docket docket=new Docket(DocumentationType.SWAGGER_2)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .host(&quot;https://www.baidu.com&quot;)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .apiInfo(apiInfo())</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .groupName(groupName)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .select()</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .apis(RequestHandlerSelectors.basePackage(&quot;com.swagger.bootstrap.ui.demo.new2&quot;))</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .paths(PathSelectors.any())</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .build()</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .securityContexts(securityContexts).securitySchemes(securitySchemes);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    return docket;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="3193-客户端模式client_credentials">3.19.3 客户端模式(client_credentials)<a class="hash-link" href="#3193-客户端模式client_credentials" title="标题的直接链接">​</a></h2><p>客户端模式(client_credentials)在Knife4j中界面显示效果如下(点击左侧菜单<strong>Authorize</strong>查看)：</p><p>界面效果如下：</p><p><img loading="lazy" src="" width="1016" height="401" class="img_ev3q"></p><p>使用者直接输入<code>clientId</code>及<code>clientSecret</code>后，点击授权即可</p><p><strong>注意</strong>：当点击按钮Authorize授权后,如果授权成功,接下来点击其余的接口进行调试时，在请求头会存在参数<code>Authorization</code>,如何在未授权之前打开了接口,则需要在授权后关闭该接口的Tab，然后重新打开</p><p>创建Swagger的授权配置示例代码：</p><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>点击查看代码</div><div class="admonitionContent_S0QG"><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">@Bean(value = &quot;defaultApi2&quot;)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">public Docket defaultApi2() {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //schema</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    List&lt;GrantType&gt; grantTypes=new ArrayList&lt;&gt;();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //客户端模式（client credentials）</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    String clientTokenUrl=&quot;http://192.168.1.10:8080/oauth/token&quot;;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    ClientCredentialsGrant clientCredentialsGrant=new ClientCredentialsGrant(clientTokenUrl);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    grantTypes.add(clientCredentialsGrant);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    OAuth oAuth=new OAuthBuilder().name(&quot;oauth2&quot;)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .grantTypes(grantTypes).build();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //context</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //scope方位</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    List&lt;AuthorizationScope&gt; scopes=new ArrayList&lt;&gt;();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    scopes.add(new AuthorizationScope(&quot;read&quot;,&quot;read all resources&quot;));</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    SecurityReference securityReference=new SecurityReference(&quot;oauth2&quot;,scopes.toArray(new AuthorizationScope[]{}));</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    SecurityContext securityContext=new SecurityContext(CollectionUtil.newArrayList(securityReference),PathSelectors.ant(&quot;/api/**&quot;));</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //schemas</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    List&lt;SecurityScheme&gt; securitySchemes=CollectionUtil.newArrayList(oAuth);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //securyContext</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    List&lt;SecurityContext&gt; securityContexts=CollectionUtil.newArrayList(securityContext);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    String groupName=&quot;2.X版本&quot;;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    Docket docket=new Docket(DocumentationType.SWAGGER_2)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .host(&quot;https://www.baidu.com&quot;)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .apiInfo(apiInfo())</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .groupName(groupName)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .select()</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .apis(RequestHandlerSelectors.basePackage(&quot;com.swagger.bootstrap.ui.demo.new2&quot;))</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .paths(PathSelectors.any())</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .build()</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .securityContexts(securityContexts).securitySchemes(securitySchemes);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    return docket;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="3194-密码模式password">3.19.4 密码模式(password)<a class="hash-link" href="#3194-密码模式password" title="标题的直接链接">​</a></h2><p>密码模式(password)在Knife4j中界面显示效果如下(点击左侧菜单<strong>Authorize</strong>查看)：</p><p>界面效果如下：</p><p><img loading="lazy" src="/assets/images/oauth-password-41fabfa9797c5e608316e7e7630ce101.png" width="1036" height="512" class="img_ev3q"></p><p>使用者直接输入<code>username</code>,<code>password</code>,<code>clientId</code>及<code>clientSecret</code>后，点击授权即可</p><p><strong>注意</strong>：当点击按钮Authorize授权后,如果授权成功,接下来点击其余的接口进行调试时，在请求头会存在参数<code>Authorization</code>,如何在未授权之前打开了接口,则需要在授权后关闭该接口的Tab，然后重新打开</p><p>创建Swagger的授权配置示例代码：</p><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>点击查看代码</div><div class="admonitionContent_S0QG"><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">@Bean(value = &quot;defaultApi2&quot;)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">public Docket defaultApi2() {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //schema</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    List&lt;GrantType&gt; grantTypes=new ArrayList&lt;&gt;();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //密码模式</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    String passwordTokenUrl=&quot;http://192.168.1.10:8080/oauth/token&quot;;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    ResourceOwnerPasswordCredentialsGrant resourceOwnerPasswordCredentialsGrant=new ResourceOwnerPasswordCredentialsGrant(passwordTokenUrl);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    grantTypes.add(resourceOwnerPasswordCredentialsGrant);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    OAuth oAuth=new OAuthBuilder().name(&quot;oauth2&quot;)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .grantTypes(grantTypes).build();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //context</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //scope方位</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    List&lt;AuthorizationScope&gt; scopes=new ArrayList&lt;&gt;();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    scopes.add(new AuthorizationScope(&quot;read&quot;,&quot;read all resources&quot;));</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    SecurityReference securityReference=new SecurityReference(&quot;oauth2&quot;,scopes.toArray(new AuthorizationScope[]{}));</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    SecurityContext securityContext=new SecurityContext(CollectionUtil.newArrayList(securityReference),PathSelectors.ant(&quot;/api/**&quot;));</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //schemas</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    List&lt;SecurityScheme&gt; securitySchemes=CollectionUtil.newArrayList(oAuth);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    //securyContext</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    List&lt;SecurityContext&gt; securityContexts=CollectionUtil.newArrayList(securityContext);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    String groupName=&quot;2.X版本&quot;;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    Docket docket=new Docket(DocumentationType.SWAGGER_2)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .host(&quot;https://www.baidu.com&quot;)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .apiInfo(apiInfo())</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .groupName(groupName)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .select()</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .apis(RequestHandlerSelectors.basePackage(&quot;com.swagger.bootstrap.ui.demo.new2&quot;))</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .paths(PathSelectors.any())</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .build()</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            .securityContexts(securityContexts).securitySchemes(securitySchemes);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    return docket;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-edit-meta-row row"><div class="col"></div><div class="col lastUpdated_vwxv"><span class="theme-last-updated">最后<!-- -->由 <b>xiaoyumin</b> <!-- -->于 <b><time datetime="2022-08-14T10:05:39.000Z">2022年8月14日</time></b> <!-- -->更新</span></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="文档分页导航"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/features/afterScript"><div class="pagination-nav__sublabel">上一页</div><div class="pagination-nav__label">3.18 afterScript</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/features/postman"><div class="pagination-nav__sublabel">下一页</div><div class="pagination-nav__label">3.20 导出Postman</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#3191-简化模式implicit" class="table-of-contents__link toc-highlight">3.19.1 简化模式(implicit)</a></li><li><a href="#3192-授权码模式authorization_code" class="table-of-contents__link toc-highlight">3.19.2 授权码模式(authorization_code)</a></li><li><a href="#3193-客户端模式client_credentials" class="table-of-contents__link toc-highlight">3.19.3 客户端模式(client_credentials)</a></li><li><a href="#3194-密码模式password" class="table-of-contents__link toc-highlight">3.19.4 密码模式(password)</a></li></ul></div></div></div></div></main></div></div><footer class="footer"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">文档指南</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/docs/quick-start">文档</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/community/simple-demo">示例</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/changelog">更新日志</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/upgrading/upgrading-to-v4">升级到v4.0</a></li></ul></div><div class="col footer__col"><div class="footer__title">社区</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://gitter.im/knife4j/knife4j" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitter<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.oschina.net/question/tag/swagger-bootstrap-ui" target="_blank" rel="noopener noreferrer" class="footer__link-item">开源中国<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">关注公众号</div><ul class="footer__items clean-list"><li class="footer__item"><img src="/images/website/qrcode.jpg" width="150"></li></ul></div><div class="col footer__col"><div class="footer__title">更多</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://docusaurus.io" target="_blank" rel="noopener noreferrer" class="footer__link-item">Docusaurus<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitee.com/xiaoym/knife4j" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitee<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/xiaoymin/swagger-bootstrap-ui" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Apache License 2.0 | Copyright © 2018-2023-八一菜刀 浙ICP备18027673号-1 </div></div></div></footer></div>
<script src="/assets/js/runtime~main.e0db172c.js"></script>
<script src="/assets/js/main.c059fb6e.js"></script>
<!-- Google Tag Manager (noscript) -->
    <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-TKBX678" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
    <!-- End Google Tag Manager (noscript) --></body>
</html>